home *** CD-ROM | disk | FTP | other *** search
/ Atari Mega Archive 1 / Atari Mega Archive - Volume 1.iso / archiver / arc.zoo / minix / scandir.c < prev    next >
C/C++ Source or Header  |  1989-01-28  |  2KB  |  91 lines

  1. /*
  2. **  SCANDIR
  3. **  Scan a directory, collecting all (selected) items into a an array.
  4. */
  5. #include <stdio.h>
  6. #include <sys/types.h>
  7. #include <dirent.h>
  8.  
  9. #ifdef    RCSID
  10. static char RCS[] = "$Header: scandir.c,v 1.1 87/12/29 21:35:56 rsalz Exp $";
  11. #endif    /* RCSID */
  12.  
  13. /* Initial guess at directory size. */
  14. #define INITIAL_SIZE    20
  15.  
  16. /* A convenient shorthand. */
  17. typedef struct dirent     ENTRY;
  18.  
  19. /* Linked in later. */
  20. #ifndef __STDC__
  21. extern char        *malloc();
  22. extern char        *realloc();
  23. #else
  24. extern void        *malloc();
  25. extern void        *realloc();
  26. #endif
  27. extern char        *strcpy();
  28.  
  29.  
  30. int
  31. scandir(Name, List, Selector, Sorter)
  32.     char          *Name;
  33.     ENTRY        ***List;
  34.     int             (*Selector)();
  35.     int             (*Sorter)();
  36. {
  37.     register ENTRY     **names;
  38.     register ENTRY      *E;
  39.     register DIR      *Dp;
  40.     register int       i;
  41.     register int       size;
  42.  
  43.     /* Get initial list space and open directory. */
  44.     size = INITIAL_SIZE;
  45.     if ((names = (ENTRY **)malloc(size * sizeof names[0])) == NULL
  46.      || (Dp = opendir(Name)) == NULL)
  47.     return(-1);
  48.  
  49.     /* Read entries in the directory. */
  50.     for (i = 0; E = readdir(Dp); )
  51.     if (Selector == NULL || (*Selector)(E)) {
  52.         /* User wants them all, or he wants this one. */
  53.         if (++i >= size) {
  54.         size <<= 1;
  55.         names = (ENTRY **)realloc((char *)names, size * sizeof names[0]);
  56.         if (names == NULL) {
  57.             closedir(Dp);
  58.             return(-1);
  59.         }
  60.         }
  61.  
  62.         /* Copy the entry. */
  63. #ifdef atarist
  64.         if ((names[i - 1] = (ENTRY *)malloc(DIRSIZ)) == NULL) { 
  65. #else
  66.         if ((names[i - 1] = (ENTRY *)malloc(E->d_reclen)) == NULL) { 
  67. #endif
  68.         closedir(Dp);
  69.         return(-1);
  70.         }
  71.         names[i - 1]->d_ino = E->d_ino;
  72. #ifndef atarist
  73.         names[i - 1]->d_off = E->d_off;
  74.         names[i - 1]->d_reclen = E->d_reclen;
  75. #endif
  76.      /*   names[i - 1]->d_namlen = E->d_namlen; */
  77.         (void)strcpy(names[i - 1]->d_name, E->d_name);
  78.     }
  79.  
  80.     /* Close things off. */
  81.     names[i] = NULL;
  82.     *List = names;
  83.     closedir(Dp);
  84.  
  85.     /* Sort? */
  86.     if (i && Sorter)
  87.     qsort((char *)names, i, sizeof names[0], Sorter);
  88.  
  89.     return(i);
  90. }
  91.